#ifndef PARSERUTILS_H
#define PARSERUTILS_H

using namespace std;

class ParserUtils {

public:

    virtual void parseLine(string line){

        std::transform(line.begin(), line.end(), line.begin(),(int(*)(int)) std::tolower);
        char* token = strtok((char*) line.c_str(), " ,.-\"()—;:?¿!¡\t\v\n\r\f");
       if (token != NULL) {
           string term=string(token);
           if(isIndexable(term))
               addToken(term);
           while (token != NULL){
               token = strtok(NULL, " ,.-\"()—;:?¿!¡\t\v\n\r\f");
               if (token != NULL){
                   term=string(token);
                   if(isIndexable(term))
                       addToken(term);
               }
           }
           delete(token);
       }
    }


    bool isIndexable(string token){
        //Si es un numero
        if(token.find_first_not_of("0123456789") == std::string::npos){
            //Solo indexo los numeros de 4 digitos.
            if(token.length()!=4)
                return false;
            //Valido 2xxx o 1xxx
            if((token.substr(0,1).find_first_of("12")!=0))
                return false;

            //Valido 20xx
            if((token.substr(0,1).compare("2")==0) && token.substr(1,1).compare("0")!=0)
                return false;

            //Si no es un numero y empieza con un numero no lo indexo.
        }else if(token.substr(0,1).find_first_of("0123456789")==0){
            return false;
        }
        return true;
    }

    virtual void addToken(string term) = 0;
};

#endif
